package 算法.位运算;

public class JZ65不用加减乘除做加法 {

    //位运算非递归
    // 进位  1 1 -> 1 &
    // 两位相加  -> ^
    public int Add(int num1,int num2) {
        // add表示进位值
        int add = num2;
        // sum表示总和
        int sum = num1;
        // 当不再有进位的时候终止循环
        while(add != 0) {
            // 将每轮的无进位和与进位值做异或求和
            int temp = sum ^ add;  //求和  ^ 同0异1
            // 进位值是用与运算产生的
            add = (sum & add) << 1; //进位 同为1才为 (1进位)
            // 更新sum为新的和
            sum = temp;
        }
        return  sum;
    }

    public static void main(String[] args) {
        System.out.println(new JZ65不用加减乘除做加法().Add(10, 15));
    }

    //位运算递归
    public int Add2(int num1,int num2) {
        // 递归地求和，也是判断是否有进位值，此时进位值用num2来表示，每轮的结果都存储在num1中
        return num2 != 0 ? Add2(num1 ^ num2, (num1 & num2) << 1) : num1;
    }
}
